<?php

namespace app\common\library;

/**
 * 百度人脸识别
 */
class AipFace
{
    protected static $instance = null;
    protected $api;

    public function __construct()
    {
        vendor('AipFace');
        $this->api = new \AipFace(config('face.app_id'), config('face.app_key'), config('face.secret_key'));
    }

    public static function instance($options = [])
    {
        if (is_null(self::$instance)) {
            self::$instance = new static($options);
        }

        return self::$instance;
    }

    /**
     * 人脸检测
     *
     * @User ZhenZiHan
     * @Date 2020/3/16
     *
     * @param $image      string 图片信息「总数据大小应小于10M，图片上传方式根据 image_type 来判断」
     * @param $image_type string 图片类型 BASE64：图片的 base64 值，base64 编码后的图片数据「base64,后面开始截取」，编码后的图片大小不超过 2M；URL：图片的 URL 地址「可能由于网络等原因导致下载图片时间过长」；FACE_TOKEN: 人脸图片的唯一标识，调用人脸检测接口时，会为每个人脸图片赋予一个唯一的 FACE_TOKEN ，同一张图片多次检测得到的 FACE_TOKEN 是同一个；
     * @return mixed
     */
    public function detect($image, $image_type)
    {
        return $this->api->detect($image, $image_type);
    }

    /**
     * 人脸注册
     *
     * @User ZhenZiHan
     * @Date 2020/3/16
     *
     * @param $image      string 图片信息「总数据大小应小于10M，图片上传方式根据 image_type 来判断」
     * @param $image_type string 图片类型 BASE64：图片的 base64 值，base64 编码后的图片数据「base64,后面开始截取」，编码后的图片大小不超过 2M；URL：图片的 URL 地址「可能由于网络等原因导致下载图片时间过长」；FACE_TOKEN: 人脸图片的唯一标识，调用人脸检测接口时，会为每个人脸图片赋予一个唯一的 FACE_TOKEN ，同一张图片多次检测得到的 FACE_TOKEN 是同一个；
     * @param $group_id   string 用户组id（由数字、字母、下划线组成），长度限制128B
     * @param $user_id    string 用户id（由数字、字母、下划线组成），长度限制128B
     * @param $options
     * @return mixed
     */
    public function addUser($image, $image_type, $group_id, $user_id, $options)
    {
        $ret = $this->api->detect($image, $image_type);

        if ($ret['error_code']) {
            return $ret;
        }

//        $options["user_info"] = "user's info"; //用户资料，长度限制256B
//        $options["quality_control"] = "NORMAL"; //图片质量控制 NONE: 不进行控制 LOW:较低的质量要求 NORMAL: 一般的质量要求 HIGH: 较高的质量要求 默认 NONE
//        $options["liveness_control"] = "LOW"; //活体检测控制 NONE: 不进行控制 LOW:较低的活体要求(高通过率 低攻击拒绝率) NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率) HIGH: 较高的活体要求(高攻击拒绝率 低通过率) 默认NONE
//        $options["action_type"] = "REPLACE";//操作方式 APPEND: 当user_id在库中已经存在时，对此user_id重复注册时，新注册的图片默认会追加到该user_id下,REPLACE : 当对此user_id重复注册时,则会用新图替换库中该user_id下所有图片,默认使用APPEND

        return $this->api->addUser($image, $image_type, $group_id, $user_id, $options);
    }

    /**
     * 人脸搜索
     *
     * @User ZhenZiHan
     * @Date 2020/3/16
     *
     * @param $image         string 图片信息「总数据大小应小于10M，图片上传方式根据 image_type 来判断」
     * @param $image_type    string 图片类型 BASE64：图片的 base64 值，base64 编码后的图片数据「base64,后面开始截取」，编码后的图片大小不超过 2M；URL：图片的 URL 地址「可能由于网络等原因导致下载图片时间过长」；FACE_TOKEN: 人脸图片的唯一标识，调用人脸检测接口时，会为每个人脸图片赋予一个唯一的 FACE_TOKEN ，同一张图片多次检测得到的 FACE_TOKEN 是同一个；
     * @param $group_id_list string 从指定的group中进行查找 用逗号分隔，上限20个
     * @param $options
     * @return mixed
     */
    public function search($image, $image_type, $group_id_list, $options)
    {
        $group_id_list = 'mp,' . $group_id_list;
        return $this->api->search($image, $image_type, $group_id_list, $options);
    }

    public function groupDelete($group_id, $options = [])
    {
        return $this->api->groupDelete($group_id, $options);
    }
}
